package cn.zyf;

import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class PaiBan {

    public static void main(String[] args) throws Exception {
        new PaiBan().run();
    }

    private void run() throws Exception {
        int[][] matrix = read();
        List<List<Integer>> groups = group();
        int[][] fill = new int[matrix.length][matrix[0].length];
        int max = (matrix.length - 1) / matrix[0].length + 1;
        boolean success = test(matrix, groups, fill, 0, 0, max);
        if (success) {
            for (int[] arr : fill) {
                System.out.println(Arrays.toString(arr));
            }
//            System.out.println(Arrays.deepToString(fill));
        } else {
            System.err.println("cannot match");
        }
    }

    private int[][] read() throws Exception {
        XSSFWorkbook workbook = new XSSFWorkbook("D:\\zyf\\工作簿1.xlsx");
        XSSFSheet sheet = workbook.getSheetAt(0);
        int[][] matrix = new int[26][8];
        for (int i = 1; i <= 1 + matrix.length - 1; i++) {
            XSSFRow row = sheet.getRow(i);
            for (int j = 1; j <= 1 + matrix[0].length - 1; j++) {
                XSSFCell cell = row.getCell(j);
                int v = 1;
                if (cell == null || (cell.getCellTypeEnum() == CellType.NUMERIC && cell.getNumericCellValue() < 0.5) || (cell.getCellTypeEnum() == CellType.STRING && "0".equals(cell.getStringCellValue().trim()))) {
                    v = 0;
                }
                matrix[i - 1][j - 1] = v;
            }
        }
        return matrix;
    }

    private List<List<Integer>> group() {
        List<List<Integer>> list = new ArrayList<>();

        List<Integer> l1 = new ArrayList<>();
        l1.add(0);

        List<Integer> l2 = new ArrayList<>();
        l2.add(1);
        l2.add(2);
        l2.add(3);
        l2.add(4);
        l2.add(5);
        l2.add(6);
        l2.add(7);
        l2.add(8);
        l2.add(9);

        List<Integer> l3 = new ArrayList<>();
        l3.add(10);
        l3.add(11);
        l3.add(12);

        List<Integer> l4 = new ArrayList<>();
        l4.add(13);
        l4.add(14);
        l4.add(15);
        l4.add(16);
        l4.add(17);

        List<Integer> l5 = new ArrayList<>();
        l5.add(18);
        l5.add(19);
        l5.add(20);
        l5.add(21);
        l5.add(22);
        l5.add(23);
        l5.add(24);
        l5.add(25);

        list.add(l1);
        list.add(l2);
        list.add(l3);
        list.add(l4);
        list.add(l5);

        return list;
    }

    private int MATRIX_BU_NENG_ZHI_BAN = 1;
    private int FILL_ZHI_BAN = 1;
    private int FILL_NO_ZHI_BAN = 0;

    public boolean test(int[][] matrix, List<List<Integer>> groups, int[][] fill, int row, int nextStart, int max) {
        if (row == fill.length) {
            return true;
        }
        h: for (int j = 0; j < matrix[row].length; j++) {
            int index = j + nextStart;
            index %= matrix[row].length;
            // 不能值班的跳过
            if (matrix[row][index] == MATRIX_BU_NENG_ZHI_BAN) {
                continue;
            }
            // 同一个假期中已经值了的跳过
            for (int m = 0; m < groups.size(); m++) {
                boolean inGroup = false;
                for (int n = 0; n < groups.get(m).size(); n++) {
                    if (groups.get(m).get(n) == row) {
                        inGroup = true;
                        break;
                    }
                }
                if (inGroup) {
                    for (int n = 0; n < groups.get(m).size(); n++) {
                        int ri = groups.get(m).get(n);
                        if (ri < row && fill[ri][index] == FILL_ZHI_BAN) {
                            continue h;
                        }
                    }
                    break;
                }
            }
            // 超过最大值班次数的跳过
            int count = 0;
            for (int i = 0; i < row; i++) {
                if (fill[i][index] == FILL_ZHI_BAN) {
                    count++;
                }
            }
            if (count >= max) {
                continue;
            }

            fill[row][index] = FILL_ZHI_BAN;
            boolean success = test(matrix, groups, fill, row + 1, index + 1, max);
            if (success) {
                return true;
            }
            fill[row][index] = FILL_NO_ZHI_BAN;
        }
        return false;
    }

}
